package gestion.comunicacion;

import entidades.Jugador;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
import jugadorVirtual.ElegirColor;
import jugadorVirtual.Principal;

public class ClienteVirtual extends Thread {

    private String ipServidor;
    private ElegirColor ec;
    private Socket socketCliente;
    private PrintWriter salida;
    private BufferedReader entrada;
    private boolean corre = true;
    private Principal p;
    private String delimitador = "&-&-&";
    private int[] tarjetas = new int[50];
    private int id;
    private int tipoMision;

    public ClienteVirtual(String ipServidor, ElegirColor ec,int tipoMis) {
        this.ipServidor = ipServidor;
        this.ec = ec;
        this.ec.setCliente(this);
        this.tipoMision= tipoMis;
    }

    public void run() {
        try {
            socketCliente = new Socket(ipServidor, 4444);
            salida = new PrintWriter(socketCliente.getOutputStream(), true);
            entrada = new BufferedReader(new InputStreamReader(socketCliente.getInputStream()));
            System.out.println("Cliente en linea...");
            String lineaEntrada, lineaSalida;
            conocerNombrePartida();
            conocerColoresOcupados();
            while (corre) {
                if ((lineaEntrada = entrada.readLine()) != null) {

                    if (lineaEntrada.compareTo("finMazoTarjeta") == 0) {
                        p.mezclarMazo();
                    } else if (lineaEntrada.compareTo("finTurno") == 0) {
                        p.cambiarTurno();
                    } else if (lineaEntrada.compareTo("solicitarTarjeta") == 0) {
                        p.sacarTarjeta();
                    } else if (lineaEntrada.compareTo("finRonda") == 0) {
                        p.cambiarRonda();
                    } else {
                        ArrayList<String> contenidoLineaEntrada = analizarCadena(lineaEntrada);
                        if (contenidoLineaEntrada.get(0).compareTo("iniciarPartida") == 0) {
                            ec.iniciarPartida(construirArrayJugadores(contenidoLineaEntrada), construirArrayPaises(contenidoLineaEntrada), Integer.parseInt(contenidoLineaEntrada.get(contenidoLineaEntrada.size() - 2)), Integer.parseInt(contenidoLineaEntrada.get(contenidoLineaEntrada.size() - 1)), this.tarjetas,this.tipoMision);
                        } else if (contenidoLineaEntrada.get(0).compareTo("avisarNombrePartida") == 0) {
                            //Acá se mandaría el nombre de la partida
                            this.id = Integer.parseInt(contenidoLineaEntrada.get(2));
                        } else if (contenidoLineaEntrada.get(0).compareTo("color") == 0) {
                            avisarClienteSeleccionColor(contenidoLineaEntrada);
                        } else if (contenidoLineaEntrada.get(0).compareTo("avisarColores") == 0) {
                            avisarClienteColoresOcupados(contenidoLineaEntrada);
                        } else if (contenidoLineaEntrada.get(0).compareTo("nuevaTropaPais") == 0) {
                            int idP = Integer.parseInt(contenidoLineaEntrada.get(1));
                            p.agregarTropaPais(idP);
                        } else if (contenidoLineaEntrada.get(0).compareTo("avisarAtaque") == 0) {
                            p.actualizarAtaque(contenidoLineaEntrada);
                        } else if (contenidoLineaEntrada.get(0).compareTo("avisarReagrupacion") == 0) {
                            p.actualizarReagrupacion(Integer.parseInt(contenidoLineaEntrada.get(1)), Integer.parseInt(contenidoLineaEntrada.get(2)));
                        } else if (contenidoLineaEntrada.get(0).compareTo("avisarFinPartida") == 0) {
                            p.avisarFinPartida(Integer.parseInt(contenidoLineaEntrada.get(1)));
                        } else if (contenidoLineaEntrada.get(0).compareTo("usoTarjeta") == 0) {
                            p.avisarUsoTarjeta(Integer.parseInt(contenidoLineaEntrada.get(1)));
                        }
                    }
                }
            }
        } catch (UnknownHostException ex) {
            Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public void avisarSeleccionColor(String color, String usuario) {
        salida.println("color" + delimitador + color + delimitador + usuario);
    }

    public int getIdJugador() {
        return id;
    }

    public void setPrincipal(Principal p) {
        this.p = p;
    }

    public void avisarFinPartida() {
        salida.println("finPartida");
    }

    public void avisarAgregacionDeTropa(int idB) {
        salida.println("nuevaTropaPais" + delimitador + idB);
    }

    public void avisarFinTurno() {
        salida.println("finTurno");
    }

    private ArrayList<String> analizarCadena(String test) {

        ArrayList<String> tokens = new ArrayList<String>();

        Scanner tokenize = new Scanner(test);
        tokenize.useDelimiter(delimitador);
        while (tokenize.hasNext()) {
            tokens.add(tokenize.next());
        }
        return tokens;
    }

    private void conocerColoresOcupados() {
        salida.println("conocerColores");
    }

    private ArrayList<Jugador> construirArrayJugadores(ArrayList<String> contenidoLineaEntrada) {
        ArrayList<Jugador> jugadores = new ArrayList();
        int cantidadJugadores = Integer.parseInt(contenidoLineaEntrada.get(1));
        int contId = 2;
        int contNombre = 3;
        int contColor = 4;

        for (int i = 0; i < cantidadJugadores; i++) {
            int id = Integer.parseInt(contenidoLineaEntrada.get(contId));
            String nombre = contenidoLineaEntrada.get(contNombre);
            String color = contenidoLineaEntrada.get(contColor);

            jugadores.add(new Jugador(id, nombre, color));

            contId += 3;
            contNombre += 3;
            contColor += 3;
        }
        return jugadores;
    }

    private int[] construirArrayPaises(ArrayList<String> contenidoLineaEntrada) {
        int[] arrayPaises = new int[50];
        int comenzar = 2 + Integer.parseInt(contenidoLineaEntrada.get(1)) * 3;
        for (int i = comenzar; i < contenidoLineaEntrada.size() - 2; i = i + 3) {
            arrayPaises[Integer.parseInt(contenidoLineaEntrada.get(i))] = Integer.parseInt(contenidoLineaEntrada.get(i + 1));
            tarjetas[Integer.parseInt(contenidoLineaEntrada.get(i))] = Integer.parseInt(contenidoLineaEntrada.get(i + 2));
        }
        return arrayPaises;
    }

    private void avisarClienteSeleccionColor(ArrayList<String> contenidoLineaEntrada) {
        ec.seleccionColor(contenidoLineaEntrada);
    }

    private void avisarClienteColoresOcupados(ArrayList<String> contenidoLineaEntrada) {
        ec.seleccionColoresOcupados(contenidoLineaEntrada);
    }

    private void conocerNombrePartida() {
        salida.println("conocerNombrePartida");
    }

    public void avisarAtaque(String avisar) {
        salida.println(avisar);
    }

    public void avisarReagrupacion(String avisar) {
        salida.println(avisar);
    }

    public void avisarFinDeMazoTarjeta() {
        salida.println("finMazoTarjeta");
    }

    public void avisarSolicitudTarjeta() {
        salida.println("solicitudTarjeta");
    }

    public void avisarUsoTarjeta(int idPais) {
        salida.println("usoTarjeta" + delimitador + idPais);
    }
}